/**
 * 将日期格式化成指定格式的字符串
 * @param date 要格式化的日期，不传时默认当前时间，也可以是一个时间戳
 * @param fmt 目标字符串格式，支持的字符有：y,M,d,q（季度）,w,H,h,m,S，默认：yyyy-MM-dd HH:mm:ss
 * @returns 返回格式化后的日期字符串
 */
const formatDate = function (date, fmt) {
    date = date == undefined ? new Date() : date;
    date = typeof date == 'number' ? new Date(date) : date;
    fmt = fmt || 'yyyy-MM-dd HH:mm:ss';
    var obj =
    {
        'y': date.getFullYear(), // 年份，注意必须用getFullYear
        'M': date.getMonth() + 1, // 月份，注意是从0-11
        'd': date.getDate(), // 日期
        'q': Math.floor((date.getMonth() + 3) / 3), // 季度
        'w': date.getDay(), // 星期，注意是0-6
        'H': date.getHours(), // 24小时制
        'h': date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, // 12小时制
        'm': date.getMinutes(), // 分钟
        's': date.getSeconds(), // 秒
        'S': date.getMilliseconds() // 毫秒
    };
    var week = ['天', '一', '二', '三', '四', '五', '六'];
    for (var i in obj) {
        fmt = fmt.replace(new RegExp(i + '+', 'g'), function (m) {
            var val = obj[i] + '';
            if (i == 'w') return (m.length > 2 ? '星期' : '周') + week[val];
            for (var j = 0, len = val.length; j < m.length - len; j++) val = '0' + val;
            return m.length == 1 ? val : val.substring(val.length - m.length);
        });
    }
    return fmt;
}
/**
 * 将字符串解析成日期
 * @param str 输入的日期字符串，如'2014-09-13'
 * @param fmt 字符串格式，默认'yyyy-MM-dd'，支持如下：y、M、d、H、m、s、S，不支持w和q
 * @returns 解析后的Date类型日期
 */
const parseDate = function (str, fmt) {
    fmt = fmt || 'yyyy-MM-dd';
    var obj = { y: 0, M: 1, d: 0, H: 0, h: 0, m: 0, s: 0, S: 0 };
    fmt.replace(/([^yMdHmsS]*?)(([yMdHmsS])\3*)([^yMdHmsS]*?)/g, function (m, $1, $2, $3, $4, idx, old) {
        str = str.replace(new RegExp($1 + '(\\d{' + $2.length + '})' + $4), function (_m, _$1) {
            obj[$3] = parseInt(_$1);
            return '';
        });
        return '';
    });
    obj.M--; // 月份是从0开始的，所以要减去1
    var date = new Date(obj.y, obj.M, obj.d, obj.H, obj.m, obj.s);
    if (obj.S !== 0) date.setMilliseconds(obj.S); // 如果设置了毫秒
    return date;
}
/**
 * 两个日期对象大小
 * @param {} date1 
 * @param {*} date2 
 */
const compare2DateByDay = function (date1, date2) {
    date1 = formatDate(date1, 'yyyy-MM-dd');
    date2 = formatDate(date2, 'yyyy-MM-dd');
    if (date1 == date2) {
        return 0;
    } else if (date1 > date2) {
        return 1;
    } else {
        return -1;
    }
}

const getDateTime = (type) => {
    // 获取当前日期
    let timestamp = Date.parse(new Date());
    let date = new Date(timestamp);
    if (type == 'tomorrow') { // 明天
        date.setDate(date.getDate() + 1);

    } else if (type == 'today') { // 今天
        date.setDate(date.getDate());
    }
    //获取年份  
    var Y = date.getFullYear();
    //获取月份  
    var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
    //获取当日日期 
    var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
    let todayDate = Y + '-' + M + '-' + D;
    return todayDate
};

//获取当前天加几天
const addDateTime = (num) => {
    // 获取当前日期
    let timestamp = Date.parse(new Date());
    let date = new Date(timestamp);
    date.setDate(date.getDate() + num);
    //获取年份  
    var Y = date.getFullYear();
    //获取月份  
    var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1);
    //获取当日日期 
    var D = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
    let todayDate = Y + '-' + M + '-' + D;
    return todayDate
};
//本月第一天
const getFirstDayOfMonth = () => {
    var y = new Date().getFullYear(); //获取年份
    var m = new Date().getMonth() + 1; //获取月份
    var d = '01'
    m = m < 10 ? '0' + m : m; //月份补 0

    return [y, m, d].join("-")
}
//获取当前月前几个月的第一天
const getFirstDayBeforeCurMonth = (n) => {
    let date = new Date()
    date.setMonth(date.getMonth() - n)
    date.toLocaleDateString()
    let y = date.getFullYear()
    let m = date.getMonth() + 1
    m = m < 10 ? '0' + m : m
    return y + '-' + m + '-' + '01'
}
//本月最后一天
const getLastDayOfMonth = () => {
    var y = new Date().getFullYear(); //获取年份
    var m = new Date().getMonth() + 1; //获取月份
    var d = new Date(y, m, 0).getDate(); //获取当月最后一日
    m = m < 10 ? '0' + m : m; //月份补 0
    d = d < 10 ? '0' + d : d; //日数补 0

    return [y, m, d].join("-")
}
//获取当前月前几个月的最后一天
const getLastDayBeforeCurMonth = (n) => {
    let date = new Date()
    date.setMonth(date.getMonth() - n)
    date.toLocaleDateString()
    var y = date.getFullYear(); //获取年份
    var m = date.getMonth() + 1; //获取月份
    var d = new Date(y, m, 0).getDate(); //获取当月最后一日
    m = m < 10 ? '0' + m : m; //月份补 0
    d = d < 10 ? '0' + d : d; //日数补 0
    return [y, m, d].join("-")
}
/**
 * addDay 加减天数
 * @param {*} date  当前日期对象
 * @param {*} offset  加减天数
 * @returns  新日期对象
 */
const addDay = (date, offset) => {
    let tempDate = new Date();
    tempDate.setTime(date.getTime() + (24 * 60 * 60 * 1000 * offset))
    return tempDate;
}
/**
 * 两个日期之间的天数
 */
const getDaysBetween=(dateString1,dateString2)=>{
    var  startDate = Date.parse(dateString1);
    var  endDate = Date.parse(dateString2);
    if (startDate>endDate){
        return 0;
    }
    if (startDate==endDate){
        return 1;
    }
    var days=(endDate - startDate)/(1*24*60*60*1000);
    return  days;
}
export {
    addDay,
    formatDate,
    parseDate,
    compare2DateByDay,
    getDateTime,
    addDateTime,
    getFirstDayOfMonth,
    getLastDayOfMonth,
    getFirstDayBeforeCurMonth,
    getLastDayBeforeCurMonth,
    getDaysBetween
}